/**
 * JimBot - Java IM Bot
 * Copyright (C) 2006-2009 JimBot project
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

package faac;

import java.io.*;
import java.nio.channels.FileLock;
import faac.http.Server;
import faac.util.*;




/**
 * Запуск бота
 * @author Prolubnikov Dmitriy
 * @author ~F@@C~ 2010
 * Использована информация статьи http://itfreak.ru/development/java-single-application-instance/
 */
public class start {
    private static final String LOCK_FILE_NAME = ".lock"; // имя lock-файла
    private static File rootDir; // директория, в которой находится lock-файл

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Throwable {


                String consoleEnc = System.getProperty("console.encoding","Cp866");
    System.setOut(new CodepagePrintStream(System.out,consoleEnc) );
    System.setErr(new CodepagePrintStream(System.err,consoleEnc) );


    

            //System.setOut(new PrintStream(new LoggingOutputStream(Category.getRoot(), Priority.INFO), true));
            System.setErr(new PrintStream(new SystemErrLogger(), true));
//            System.setErr(new PrintStream(new LoggingOutputStream(Category.getRoot(), Priority.WARN), true));



  rootDir = new File("./"); // инициализация директории, в которой находится lock-файл
        // проверка на присутсвие единственного выполняемого экземпляра приложения;
        // естественно должна выполняться перед основной инициализацией приложения
        // и реализацией его бизнесс-логики
        singleAppInstanceCheck();
//Log.getDefault().init("");
        // Добавление jar-файлов из lib в classpath
        try {
            AddOnsLoader.loadAddOns();
        } catch (Throwable th) {
            th.printStackTrace();
        }

                MainProps.load();
                Manager.getInstance();
                    try {
                        Server.startServer();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                 try {
                	 Manager.getInstance().startAll();
                 } catch (Exception ex) {
                	 ex.printStackTrace();
                 }}

    private static void singleAppInstanceCheck() throws Throwable {
        // проверка: запущен ли другой экземпляр приложения?
        if (!lock()) { // если да, то...
            // ... информируем об этом пользователя...
            Log.getDefault().error("ЧАТ УЖЕ ЗАПУЩЕН!!!!");
//            System.err.println("JimBot is already running!");
            // ... и прекращаем работу
            System.exit(1);
        }
    }

    private static boolean lock() {
        try {
            // создаем блокировку
            final FileLock lock = new FileOutputStream(
                                           new File(rootDir, LOCK_FILE_NAME))
                                              .getChannel().tryLock();
            if (lock != null) {
                // а вот и сам "фокус":
                // создаем поток...
                new Thread(new Runnable(){
                    public void run() {
                        while (true) {
                            try {
                                // ... и проверяем валидность блокировки
                                //     внутри него...
                                if (lock.isValid()) {};
                                // ... а затем засыпаем "навечно"
                                Thread.sleep(Long.MAX_VALUE);
                            } catch (InterruptedException e) {
                                // игнорируем
                            }
                        }
                    }
                }).start();
            }
            return lock != null;
        } catch (Exception ex) {
            // игнорируем, если мы ничего не в силах поделать -
            // пользователь должен сам позаботиться о том,
            // чтобы не запускать на выполнение более одного экземпляра приложения
        }
        return true;
    }
}
